<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		<div style="height: 10000px;width: 10000px;overflow-y: auto;"></div>
		<script type="text/javascript">
			/* 在一个二维数组中（每个一维数组的长度相同）
			每一行都按照从左到右递增的顺序排序
			每一列都按照从上到下递增的顺序排序。
			请完成一个函数，输入这样的一个二维数组和一个整数，判断数组中是否含有该整数。 */
			// function hasNum (target, array) {
			// 	let index = 1;
			// 	console.log(array);
			// 	console.log(index);
			// 	let width = array[0].length;
			// 	let newArray = array;
			// 	if (target > array[0][width-1]) {
			// 		newArray = array.slice(1);
			// 		hasNum(target, newArray);
			// 	} else if (target < array[0][width-1]) {
			// 		// 二分法
			// 		newArray = array.map(item => {
			// 			return item.slice(0,width-1)
			// 		})
			// 		hasNum(target, newArray);
			// 	} else {
			// 		console.log(true);
			// 		return true;
			// 	}
			// }
			
			// function replaceSpace (str) {
			// 	return str.toString().replace(/\s/g, '%20');
			// }
			
			// let target = 100;
			// let array = [[90,91,92,93],
			// 			[91,95,99,102],
			// 			[93,96,100,103]];
			// hasNum(target,array)
			
			// console.log(this.replaceSpace('hello  world !'));
			
			
			
			
			/* 输入某二叉树的前序遍历和中序遍历的结果，请重建出该二叉树。
			假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
			例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}，则重建二叉树并返回 */
			// function buildTree (preArray, midArray) {
			// 	let root = preArray[0];
			// 	console.log("root:", root);
			// 	let rootIndex = midArray.indexOf(root);
			// 	console.log("rootIndex:", rootIndex);
			// 	// 左右子树的中序数组
			// 	let leftTreeMid = midArray.slice(0,rootIndex);
			// 	let rightTreeMid = midArray.slice(rootIndex+1);
			// 	let leftTreePre = preArray.slice(1,leftTreeMid.length + 1);
			// 	let rightTreePre = preArray.slice(leftTreePre.length + 1);
			// 	console.log("左树");
			// 	console.log(leftTreePre, leftTreeMid);
			// 	console.log("右树");
			// 	console.log(rightTreePre, rightTreeMid);
			// 	if (leftTreePre.length !== 0 || leftTreeMid.length !== 0 ) {
			// 		buildTree(leftTreePre,leftTreeMid);
			// 	} else if (rightTreePre.length !== 0 || rightTreeMid.length !== 0) {
			// 		buildTree(rightTreePre,rightTreeMid);
			// 	}
			// }
			// let preArray = [1,2,4,7,3,5,6,8];
			// let midArray = [4,7,2,1,5,3,8,6];
			// if (new Set(preArray).size !== preArray.length ||
			// 	new Set(midArray).size !== midArray.length) {
			// 		alert("存在重复数，二叉树构建失败！");
			// 	}else {
			// 		buildTree(preArray, midArray);
			// 	}
			
			
			
			/**
			 * 防抖
			 * @param {Object} fn 可能多次触发的函数
			 * @param {Object} delay 时间阈值
			 */
			// function debounce(fn,delay){
			//     let timer = null //借助闭包
			//     return function() {
			//         if(timer){
			//             clearTimeout(timer) 
			//         }
			//         timer = setTimeout(fn,delay) // 简化写法
			//     }
			// }
			// function showTop  () {
			//     var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
			// 　　console.log('滚动条位置：' + scrollTop);
			// }
			// window.onscroll = debounce(showTop,1000)
			
			
			
			/**
			 * 节能
			 * @param {Object} fn 可能多次触发的函数
			 * @param {Object} delay 时间阈值
			 */
			// function throttle (fn, delay) {
			// 	let handle = true;
			// 	return function () {
			// 		if (handle) {
			// 			handle = false;
			// 			setTimeout(() => {
			// 				fn();
			// 				handle = true;
			// 			}, delay);
						
			// 		} else {
			// 			return false;
			// 		}
			// 	}
			// }
			// function getScrollTop () {
			// 	let scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
			// 	console.log(scrollTop, '节能');
			// }
			// window.onscroll = throttle(getScrollTop, 1000);
			
			
			
			
			// 按顺序执行多个ajax命令，因为数量不定，所以采用递归
			// function send(action, arg2) {
			// //将多个命令按顺序封装成数组对象，递归执行
			// //利用了deferred对象控制回调函数的特点
			// 	$.when(send_action(action[0], arg2))
			// 	.done(function () {
			// 		if (action.length > 1) {
			// 			//队列长度大于1，则弹出第一个，继续递归执行该队列
			// 			action.shift();
			// 			send(action, arg2);
			// 		}
			// 	}).fail(function (){
			// 		//队列中元素请求失败后的逻辑
			// 		//重试发送
			// 		send(action, arg2);
			// 		//忽略错误进行下个
			// 		if (action.length > 1) {
			// 			// 队列长度大于1，则弹出第一个，继续递归执行该队列
			// 		   action.shift();
			// 		   send(action, arg2);
			// 		}
			// 	});
			// }
			
			// //处理每个命令的ajax请求以及回调函数
			// function send_action(command, arg2) {
			// 	var dtd = $.Deferred();//定义deferred对象
			// 	$.post(
			// 		"url",
			// 		{
			// 			command: command,
			// 			arg2: arg2
			// 		}
			// 	).done(function (json) {
			// 		json = $.parseJSON(json);
			// 		//每次请求回调函数的处理逻辑
			// 		//逻辑结束
			// 		dtd.resolve();
			// 	}).fail(function (){
			// 		//ajax请求失败的逻辑
			// 		dtd.reject();
			// 	});
			// 	return dtd.promise();//返回Deferred对象的promise，防止在外部修改状态
			// }
			
			
			
			// promise，ajax的异步
			// function request1 () {
			// 	let xhr = new XMLHttpRequest();
			// 	xhr.open('get','./test.html',true);
			// 	xhr.send();
			// 	xhr.onreadystatechange = () => {
			// 		if(xhr.readyState == 4) {
			// 			if (xhr.status == 200) {
			// 				console.log(xhr.responseText);
			// 			}
			// 		}
			// 	}
			// }
			// function request2 () {
			// 	let xhr = new XMLHttpRequest();
			// 	xhr.open('get','./new_file.html',true);
			// 	xhr.send();
			// 	xhr.onreadystatechange = () => {
			// 		if(xhr.readyState == 4) {
			// 			if (xhr.status == 200) {
			// 				console.log(xhr.responseText);
			// 			}
			// 		}
			// 	}
			// }
			
			// // 异步操作
			// new Promise((res, rej) => {
			// 	request1();
			// 	res();
			// }).then(() => {
			// 	request2();
			// })
			
			
			
			/**
			 * 宏任务、微任务
			 */
			fn();
			var promise = new Promise(function (resolve, reject) {
				console.log(1);
				console.log(2);
				setTimeout(() => {
					console.log(3);
				}, 0);
				resolve();
			})
			console.log(4);
			promise.then(res => {
				console.log(5);
			}).catch(err => {})
			async function fn () {
				await promise;
			}
		</script>
	</body>
</html>
